package cn.zyy.hotel.controller.admin;

import cn.zyy.hotel.entity.Menu;
import cn.zyy.hotel.entity.Role;
import cn.zyy.hotel.service.EmployeeService;
import cn.zyy.hotel.service.MenuService;
import cn.zyy.hotel.service.RoleService;
import cn.zyy.hotel.utils.Result;
import cn.zyy.hotel.utils.SystemConstant;
import cn.zyy.hotel.utils.TreeNode;
import cn.zyy.hotel.vo.RoleVO;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("/admin/role")
public class RoleController {

    @Resource
    private RoleService roleService;
    @Resource
    private EmployeeService employeeService;
    @Resource
    private MenuService menuService;

    //查询角色列表
    @RequestMapping("/list")
    public Result list(RoleVO roleVo){
        //设置分页信息
        PageHelper.startPage(roleVo.getPage(),roleVo.getLimit());
        //调用查询角色列表的方法
        List<Role> roles = roleService.selectRoleList(roleVo);
        //创建分页信息对象
        PageInfo<Role> pageInfo = new PageInfo<Role>(roles);
        return Result.builder().code(0).count(pageInfo.getTotal()).data(pageInfo.getList()).build();
    }

    //添加角色
    @RequiresPermissions("role:add")
    @RequestMapping("/addRole")
    public Object addRole(Role role){
        Map<String,Object> map = new HashMap<String,Object>();
        //调用添加角色的方法
        if(roleService.addRole(role)>0){
            //成功
            map.put(SystemConstant.SUCCESS,true);
            map.put(SystemConstant.MESSAGE,"添加成功");
        }else{
            //失败
            map.put(SystemConstant.SUCCESS,false);
            map.put(SystemConstant.MESSAGE,"添加失败");
        }
        return map;
    }

    //修改角色
    @RequiresPermissions("role:edit")
    @RequestMapping("/updateRole")
    public Object updateRole(Role role){
        Map<String,Object> map = new HashMap<String,Object>();
        //调用修改角色的方法
        if(roleService.updateRole(role)>0){
            //成功
            map.put(SystemConstant.SUCCESS,true);
            map.put(SystemConstant.MESSAGE,"修改成功");
        }else{
            //失败
            map.put(SystemConstant.SUCCESS,false);
            map.put(SystemConstant.MESSAGE,"修改失败");
        }
        return map;
    }

    //查询该角色下是否存在员工信息
    @RequestMapping("/checkRoleHasEmployee")
    public Object checkRoleHasEmployee(Integer id){
        Map<String,Object> map = new HashMap<String,Object>();
        //调用根据角色编号查询员工数量的方法
        if(employeeService.getEmployeeCountByRoleId(id)>0){
            //存在
            map.put(SystemConstant.EXIST,true);
            map.put(SystemConstant.MESSAGE,"该角色存在员工信息，无法删除");
        }else{
            //不存在
            map.put(SystemConstant.EXIST,false);
        }
        return map;
    }

    //删除角色
    @RequiresPermissions("role:delete")
    @RequestMapping("/deleteById")
    public Object deleteById(Integer id){
        Map<String,Object> map = new HashMap<String,Object>();
        //调用删除角色的方法
        if(roleService.deleteById(id)>0){
            //成功
            map.put(SystemConstant.SUCCESS,true);
            map.put(SystemConstant.MESSAGE,"删除成功");
        }else{
            //失败
            map.put(SystemConstant.SUCCESS,false);
            map.put(SystemConstant.MESSAGE,"删除失败");
        }
        return map;
    }

    //根据角色ID查询该角色拥有的菜单
    @RequestMapping("/initMenuTree")
    public Result initMenuTree(Integer roleId){
        //调用查询菜单列表的方法
        List<Menu> menuList = menuService.selectAllMenu();
        //调用根据角色ID查询该角色已经拥有的菜单ID的方法
        List<Integer> menuIds = menuService.selectMenuIdListByRoleId(roleId);
        //定义集合，保存菜单信息
        List<Menu> menus = new ArrayList<Menu>();
        //判断集合是否存在数据
        if(menuIds!=null && menuIds.size()>0){
            //根据菜单ID查询该菜单的信息
            menus = menuService.selectMenuByMenuId(menuIds);
        }
        //创建集合保存树节点信息
        List<TreeNode> treeNodes = new ArrayList<TreeNode>();
        //循环遍历集合
        for (Menu menu : menuList) {
            //定义变量，标识是否选中
            String checkArr = "0"; //0表示复选框不选中，1表示选中复选框
            //内层循环遍历当前角色拥有的权限菜单
            //循环比较的原因：比较两个集合中的数据是否有相同的，有相同的表示当前角色拥有这个权限
            for (Menu currentMenu : menus) {
                //如果ID相等，表示当前角色有这个菜单，有这个菜单则需要将复选框选中
                if(menu.getId() == currentMenu.getId()){
                    checkArr ="1";//选中
                    break;
                }
            }
            //定义变量，表示菜单是否展开
            Boolean spread = (menu.getSpread()==null || menu.getSpread()==1) ? true : false;
            treeNodes.add(TreeNode.builder().id(menu.getId()).parentId(menu.getPid()).title(menu.getTitle()).spread(spread).checkArr(checkArr).build());
        }
        //将数据返回到页面
        return Result.builder().code(0).data(treeNodes).build();
    }

    //分配菜单
    @RequiresPermissions("role:auth")
    @RequestMapping("/saveRoleMenu")
    public Object saveRoleMenu(String ids,Integer roleId){
        Map<String,Object> map = new HashMap<String,Object>();
        //调用保存角色菜单关系的方法
        if(roleService.saveRoleMenu(ids,roleId)>0){
            map.put("message","菜单分配成功");
        }else{
            map.put("message","菜单分配失败");
        }
        return map;
    }

    //根据员工Id查询该员工拥有的角色列表
    @RequestMapping("/initRoleListByEmpId")
    public Result initRoleListByEmpId(Integer id){
        //调用查询所有角色列表的方法
        List<Map<String, Object>> roleList = roleService.selectRoleListByMap();
        //调用根据员工ID查询该员工拥有的角色列表的方法
        List<Integer> roleIds = roleService.selectEmployeeRoleByEmployeeId(id);
        //循环比较两个集合中的角色ID值是否相等，相等则选中该角色
        for (Map<String, Object> map : roleList) {
            //定义变量，标识是否选中
            boolean flag = false;//不选中
            //获取每一个角色ID
            Integer rid = (Integer) map.get("id");//id是主键，以主键作为map集合中key
            //内层循环遍历该员工拥有的角色列表
            for (Integer roleId : roleIds) {
                //判断两个集合中是否存在角色ID相同
                if(rid == roleId){
                    //选中该角色
                    flag = true;
                    break;
                }
            }
            //将状态保存在map集合中
            map.put("LAY_CHECKED",flag);//key必须是LAY_CHECKED
        }
        return Result.builder().code(0).count(Long.valueOf(roleList.size())).data(roleList).build();
    }




}
